// void main() {
//   Stopwatch stopwatch = Stopwatch();

//   final Regisiter regisiter = Regisiter(addr: 0, def: 0x48, label: 'A');
//   print(regisiter);
//   print(regisiter.mask(0x18));
//   regisiter.setBit(0x18);
//   print(regisiter);
//   regisiter.clearBit(0x0f);
//   print(regisiter);
//   regisiter.reset();
//   print(regisiter);
//   stopwatch.start();
//   regisiter.isOdd();
//   stopwatch.stop();
//   print('代码运行时间：${stopwatch.elapsedMilliseconds}毫秒');

//   ///cy: tmp > 0xff, ac: ac, ov: (_acc.value & 0xc0) ^ (tmp & 0xc0) > 0
//   bool ac = false;
//   int cy;
//   cy = regisiter.value + 0x1f;
//   regisiter.value = cy;

//   ac = ((regisiter.def & 0x0f) + (0x1f & 0x0f)) > 0x0f;
//   print(regisiter);
//   print('cy:${cy > 0xff}');
//   print('ac:$ac');
//   print(((regisiter.def & 0xc0) ^ (regisiter.value & 0xc0)).toRadixString(16));
//   print('ov:${(regisiter.def & 0xc0) ^ (regisiter.value & 0xc0) == 0}');

//   final Regisiter psw = Regisiter(addr: 0, def: 0x40, label: 'A');
//   print(psw.mask(0x18) >> 3);
// }

// ignore_for_file: unused_import

import 'dart:async';

import 'package:simulator/arch/mcs51/mcs51.dart';
import 'package:simulator/core/mcu.dart';
import 'package:simulator/core/op_code.dart';
import 'package:simulator/core/regisiter.dart';
import 'package:simulator/utils/utils.dart';

// void main() {
//   // print(0x56.toSigned(8));
//   // print(0xff.toSigned(8));
//   // print(0x80.toSigned(8));
//   //const int cc = 0x2345;
//   final Regisiter regisiter = Regisiter(addr: 0, def: 0xc8, label: 'A');
//   // regisiter.value = cc;
//   // print(regisiter);
//   // regisiter.value = cc >> 8;
//   // print(regisiter);
//   regisiter.value = ~regisiter.value;
//   print(regisiter);
//   var x = regisiter.mask(0x80);
//   regisiter.value <<= 1;
//   if (x.getBool()) {
//     regisiter.setBit(0x01);
//   }
//   print(regisiter);
//   print(((regisiter.mask(0x0f) << 4) + (regisiter.mask(0xf0) >> 4)));
//   print(regisiter.value >> 4);
//   print((regisiter.value >> 4) * 0x100);
//   regisiter.setBit(0x80);
//   print(regisiter);
//   print(regisiter.mask(0x80) >> 7);
//   regisiter.clearBit(0x80);
//   print(regisiter);
//   print(regisiter.mask(0x80) >> 7);
//   regisiter.filpBit(0x08);
//   print(regisiter);
//   regisiter.filpBit(0x48);
//   print(regisiter);
//   regisiter.filpBit(0x13);
//   print(regisiter);

//   regisiter.value >>= 1;
//   print(regisiter);
//   print(regisiter.mask(0x01));
//   print(regisiter.mask(0x02));
//   var t = 0x47;
//   print(t);
//   var h = t & (0xf0);
//   var l = t & (0x0f);
//   print(((l << 4) + (h >> 4)).toRadixString(16));
//   //regisiterPrint(MCUType.mcs51);
// }

void main() {
  regisiterPrint(MCUType.mcs51);
}

void regisiterPrint(MCUType type) {
  final List<OpCode> op;
  switch (type) {
    case MCUType.mcs51:
      op = opMCS51Code;
      break;
    case MCUType.arm:
    case MCUType.riscv:
    case MCUType.x86:
    case MCUType.unkown:
      print('${type.name} not impl');
      return;
  }

  print('op size:${op.length}');
  print('isRepeat:${isRepeat(op)}');
  for (var element in op) {
    print(element);
  }
}

bool isRepeat(List<OpCode> op) {
  for (var element in op) {
    if (op.where((e) => e.code == element.code).length > 1) {
      print(element);
      return true;
    }
  }

  return false;
}

///判断是否溢出的办法-128~+127
void subOrADD(int a, int b, {bool add = true}) {
  print(
      '${a.toSigned(8)} ${add ? '+' : '-'} ${b.toSigned(8)} = ${add ? (a.toSigned(8) + b.toSigned(8)) : (a.toSigned(8) - b.toSigned(8))}');

  print('--->$a ${add ? '+' : '-'} $b = ${add ? (a + b) : (a - b)}');
}

// void main() {
//   // print((-128).overSize());
//   // print((-129).overSize());
//   // print((-1).overSize());
//   // print((0).overSize());
//   // print((127).overSize());
//   // print((128).overSize());

//   // print((-1).toUnsigned(8));
//   // print((0).toUnsigned(8));
//   // print((127).toUnsigned(8));
//   // print((-128).toUnsigned(8));
//   // print((-130).toUnsigned(8));
//   // print((158).toUnsigned(8));
//   print(0.toSigned(8));
//   print(126.toSigned(8));
//   print(127.toSigned(8));
//   print(128.toSigned(8));
//   print(129.toSigned(8));
//   print(254.toSigned(8));
//   print(255.toSigned(8));
//   print(256.toSigned(8));
//   print(257.toSigned(8));

//   ///都不进 94 94
//   subOrADD(0x2f, 0x2f);
//   print(0x2f.signedAdd(0x2f).overSize());

//   ///D6->D7 158 158
//   subOrADD(0x4f, 0x4f);
//   print(0x4f.signedAdd(0x4f).overSize());

//   ///D7->C -226 286
//   subOrADD(0x8f, 0x8f);
//   print(0x8f.signedAdd(0x8f).overSize());

//   ///全进 -98 414
//   subOrADD(0xcf, 0xcf);
//   print(0xcf.signedAdd(0xcf).overSize());
//   print('====================================');

//   ///都不借 16 16
//   subOrADD(0x2f, 0x1f, add: false);
//   print(0x2f.signedSub(0x1f).overSize());
//   subOrADD(0x8f, 0xf, add: false);
//   print(0x8f.signedSub(0xf).overSize());

//   ///D7->D6 -192 64
//   subOrADD(0x8f, 0x4f, add: false);
//   print(0x8f.signedSub(0x4f).overSize());

//   ///C->D7
//   subOrADD(0x4f, 0xcf, add: false);
//   print(0x4f.signedSub(0xcf).overSize());

//   ///全借
//   subOrADD(0xcf, 0xdf, add: false);
//   print(0xcf.signedSub(0xdf).overSize());
// }

void t() {
  throw 'eqweqweqweeqwe1';
}

// void main() {
//   runZonedGuarded(() => t(), (error, stack) {
//     ///可以捕获到所有代码
//     print('error--->$error');
//   },
//       zoneSpecification: ZoneSpecification(
//         ///那么error-zone里发生的异常是不会跨越边界的
//         handleUncaughtError: (self, parent, zone, error, stackTrace) {
//           parent.print(self, '1handleUncaughtError-->$error');
//         },
//         errorCallback: (self, parent, zone, error, stackTrace) {
//           parent.print(self, '1errorCallback-->$error');
//           return AsyncError(error, stackTrace);
//         },
//         print: (self, parent, zone, msg) {
//           //print('zone-->$msg');
//           parent.print(self, '1zone-->$msg');
//         },
//       ));
//   var zone = Zone.current.fork(
//       specification: ZoneSpecification(
//     ///那么error-zone里发生的异常是不会跨越边界的
//     handleUncaughtError: (self, parent, zone, error, stackTrace) {
//       parent.print(self, 'handleUncaughtError-->$error');
//     },
//     errorCallback: (self, parent, zone, error, stackTrace) {
//       parent.print(self, 'errorCallback-->$error');
//       return AsyncError(error, stackTrace);
//     },
//     print: (self, parent, zone, msg) {
//       //print('zone-->$msg');
//       parent.print(self, 'zone-->$msg');
//     },
//   ));
//   zone.run(() {
//     print('11111');
//     throw 'ewqe';
//   });
// }
